package com.power.powercash;

import com.db4o.query.Predicate;
import com.power.utils.SearchEngine;
import com.power.utils.SearchText;

/**
 *
 * @author f6036477
 */
public class ConsultaLancamento extends Predicate<Lancamento> 
{

  private Lancamento lanc;

  private ConsultaDate dates;

  private ConsultaDouble doubles;

	private SearchEngine engine;

  private boolean empty = false;


  public ConsultaLancamento()
  {
    lanc = null;
    dates = new ConsultaDate();
    doubles = new ConsultaDouble();
		engine = new SearchEngine();
  }


  public ConsultaLancamento(Lancamento l)
  {
    this();
    lanc = l;
  }


	public SearchEngine engine() {
		return engine;
	}


	public void setSearchEngine(SearchEngine eng) {
		engine = eng;
	}


  public Lancamento getLancamento()
  {
    return lanc;
  }


  public void setLancamento(Lancamento lanc)
  {
    this.lanc = lanc;
  }


  public ConsultaDate getConsultaDate()
  {
    return dates;
  }


  public void setConsultaDate(ConsultaDate c)
  {
    dates = c;
  }


  public ConsultaDouble getConsultaDouble()
  {
    return doubles;
  }


  public void setConsultaDouble(ConsultaDouble c)
  {
    doubles = c;
  }


  public void setEmptyQuery(boolean emptyQuery)
  {
    empty = emptyQuery;
  }


  public boolean isEmptyQuery()
  {
    return empty;
  }


  @Override
  public boolean match(Lancamento l)
  {
    if(l != null && empty) return true;
    if(lanc == null || l == null)
      return false;

    boolean databanco = false, pagto = false,
        centro = false, fin = false,
        deb = false, nonull = false;

    if(lanc.getDataBanco() != null
        && l.getDataBanco() != null) {
      databanco = dates.match(l.getDataBanco(), lanc.getDataBanco());
      nonull = true;
    } else if(lanc.getDataBanco() == null)
      databanco = true;

    if(lanc.getPagamento() != null
        && l.getPagamento() != null) {
      Pagamento p = lanc.getPagamento();
      ConsultaPagamento cp = new ConsultaPagamento(p);
      if(p instanceof Cheque)
        cp = new ConsultaCheque((Cheque) p);
      else if(p instanceof CompraCartao) 
        cp = new ConsultaCompraCartao((CompraCartao) p);

      pagto = cp.match(l.getPagamento());
      nonull = true;
    } else if(lanc.getPagamento() == null)
      pagto = true;

    if(lanc.getNumCentros() > 0
        && l.getNumCentros() > 0) {
      ConsultaCentroCustos cc = new ConsultaCentroCustos();
      CentroCustos[] cs1 = lanc.getCentros();
      CentroCustos[] cs2 = l.getCentros();

      for(CentroCustos c1 : cs1) {
        cc.setCentroCustos(c1);
        for(CentroCustos c2 : cs2) {
          centro = cc.match(c2);
          if(centro) break;
        }//for2
        if(centro) break;
      }//for1
      nonull = true;
    } else if(lanc.getNumCentros() == 0)
      centro = true;

    if(lanc.getNumFinalidades() > 0
        && l.getNumFinalidades() > 0) {

			SearchText src = new SearchText();
			SearchText sch = new SearchText();

			if(engine == null) engine = new SearchEngine();

      String[] s1 = lanc.getFinalidades();
      String[] s2 = l.getFinalidades();

      for(String r : s1) {
        sch.setText(r);
				engine.setSearch(sch);
        for(String s : s2) {
          src.setText(s);
					engine.setSource(src);
					fin = engine.match();
          if(fin) break;
        }//for2
      }//for1
      nonull = true;
    } else if(lanc.getNumFinalidades() == 0)
      fin = true;

    if(lanc.setdebito && l.setdebito) {
      deb = lanc.isDebito() == l.isDebito();
      nonull = true;
    } else if(!lanc.setdebito)
      deb = true;

    return databanco && pagto
        && centro && fin
        && deb && nonull;
  }

}
